android开发-BroadcastReceiver的底层原理

Receiver的原理
一、注册的过程
通过ContextWrapper的registerReceiver,但是实际上工作的是ContextImpllai 来完成的
真正做注册的是通过registerReceiverInternal方法在这个方法里。
注册的过程也是一个进程间通信的过程。把BroadcastReceiver封装成IIntentReceiver,BroadCastReceiver作为Android的一个组件是不能直接跨进程传递的,IIntentReceiver是一个Binder的接口,通过IIntentReceiver中转一下。
IIntentReceiver的实现类是ReceiverDispatch的InnerReceiver
ActivityManagerNative.getDefault()内部其实是ServiceManager提供的IBinder,他就是ActivityManagerService的引用
通过ActivityManagerService的registerReceiver方法就把 远程的IIntentReceiver和IntentFilter注册到服务中了。


二、广播的发送
通过ContextImpl的sendBrocast的方法实现的
通过ActivityManagerNative.getDefault().broadcastIntent();
ContextImpl什么也没干 直接向ActivityManagerService发送了一个异步请求。


broadcastIntent里面 调用了broadcastIntentLocked,这里的Intent.addFlag(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES)
这是发送给除了已经被停止的应用的app,这是在android3.1开始有的特性,在android5.0中默认的Intent.FLAG_EXCLUDE_STOPPED_PACKAGES,如果想启动已经被停止的app,设置flag:Intent.FLAG_INCLUDE_STOPPED_PACKAGES 这个flag是启动包括已经停止的广播


broadcastIntentLocked,会根据intent_filter匹配广播的接受者 然后放入一个BroadcastQueue中,这样广播就发送给相应的接受者
内部调用了app.thread.scheduleRegisterReceiver,这就是ActivityThread里面的方法,通过一个handler发送一个消息 然后调用
BroadcastReceiver里面的onReceiver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值